<?php
/**
 * 框架内核启动
 * 
 * @package core
 */

ob_start();

if(!defined('VHOST_ROOT'))
{
	define('VHOST_ROOT', $_SERVER["DOCUMENT_ROOT"]);
}

if(!defined('APPLICATON_ROOT'))
{
	trigger_error('未定义常量 APPLICATON_ROOT.', E_USER_ERROR);
}

if(!defined('SYS_ROOT'))
{
	trigger_error('未定义常量 SYS_ROOT.', E_USER_ERROR);
}

if(!defined('CFG_ROOT'))
{
	trigger_error('未定义常量 CFG_ROOT.', E_USER_ERROR);
}

/***************************  内核从这里开始正式执行 **************************************/
load_conf('pub:const');
__load_core('core:dao');
__load_core('core:model');
__load_core('core:control');

if(!defined('CORE_DAEMON'))	//当框架非用于后台Daemon脚本编写
{
	__load_core('core:dispatch');

	__dispatch_init();

	__dispatch_start();

//echo "Mem: " . memory_get_usage() / 1024 . " kb";
}
/*****************************  内核在这里执行结束 **************************************/

/**
 * 框架全局变量
 */
global $__core_env;	//框架环境变量

function set_global($name, &$value)
{
	GLOBAL $__core_env;
        
	if(!$name) return false;

	$__core_env[$name] = &$value;

	return true;
}

function &get_global($name)
{
	GLOBAL $__core_env;
        
	if(!$name) return null;

	return $__core_env[$name];
}

function del_global($name)
{
	GLOBAL $__core_env;
        
	if(!$name) return false;
        
	$__core_env[$name] = null;
	unset($__core_env[$name]);
	return true;
}

function set_cookie($name, $value, $expire = 0, $path = "", $domain = "")
{
	GLOBAL $__core_env;
        
	if(!$name) return;

	$__core_env["cookie"][$name] = array("value" => $value, "expire" => $expire, "path" => $path, "domain" => $domain);
	if($value) $_COOKIE[$name] = $value;
	else unset($_COOKIE[$name]);
}

/**
 * 核心文件加载
 *
 * 负责system, public, application 的文件加载
 *
 * @param string 文件名，包含tag标识，例如：pub:frame
 * @param string 文件所在特殊目录
 * @param bool 为true时，不加载文件，直接返回文件真实路径
 * @return mixed
 */
function __load_core($file, $dir = "", $return = false)
{
	global $__core_env;

	$tag = '';
	$pos = strpos($file, ':');
	if($pos !== false)
	{
		$tag = substr($file, 0, $pos);
		$file = substr($file, $pos + 1);
	}

	if(!in_array(substr($file, 0, 1), array('/', '\\')))
	{
		$file = '/' . $file;
	}

	$file = $dir . $file . '.php';
	if(substr($file, 0, 1) == '/') $file = substr($file , 1);

	switch($tag)
	{
		case 'core':
			$file =  SYS_ROOT . '/core/' . $file;
			break;

		case 'pub':
			$file =  SYS_ROOT . '/public/' . $file;
			break;

		case 'app':
		default: 
			$file = APPLICATON_ROOT . '/' . $file;
			break;
	}

	if(file_exists($file))
	{
		if($return)
		{
			return $file;
		}
		else
		{
			require_once($file);
			return true;
		}
	}
	else
	{
		trigger_error('文件不存在: ' . $file, E_USER_WARNING);
		return false;
	}
}

/**
 * 视图加载函数
 *
 * @param string 视图文件名
 * @param mixed 导入视图的数据
 * @param bool 为true时，直接输出
 * @return mixed
 */
function load_view($__file, $__data = null, $__print = true)
{
	GLOBAL $__core_env;
        
	if(!defined("__OUTVIEW__")) define("__OUTVIEW__", 1);
	if(!is_null($__data))
	{
		if(is_array($__data))
		{
			foreach ($__data as $__key => $__value)
			{
				if (!isset($$__key) )
				{
					$$__key = $__value;
				}
			}
		}
		else if(is_object($__data))		//将类属性转化为变量
		{
			$__data = get_object_vars($__data);
		}
		else
		{
			trigger_error(__FUNCTION__ . ' 函数的第2个参数必须是数组或者类', E_USER_NOTICE);
		}
	}

	ob_start();
	$__file2 = __load_core($__file . '.view', 'views', true);
	if($__file2) require($__file2);

	$__ob_content = ob_get_contents();
	ob_end_clean();

	if($__print)
	{
		if($__core_env["cookie"])
		{
			header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
			//header('P3P: CP="NOI DEV PSA PSD IVA PVD OTP OUR OTR IND OTC"');
			foreach($__core_env["cookie"] as $cn => $cv)
			{
				@setcookie($cn, $cv["value"], $cv["expire"], $cv["path"], $cv["domain"]);
			}
		}
		unset($__core_env["cookie"]);

		header("Content-type:text/html;charset=utf-8");
		echo $__ob_content;
	} else return $__ob_content;
}

/**
 * 基础库加载函数
 *
 * @param string 文件名
 */
function load_lib($file)
{
	__load_core($file . '.lib', 'libraries');
}

/**
 * SNS加载函数
 *
 * @param string 文件名
 */
function load_sns($file = "")
{
	if($file) __load_core("pub:{$file}", 'sns');
	else __load_core('pub:kra', 'sns');
}

/**
 * 控制器加载函数
 *
 * @param string 文件名
 */
function load_ctl($file)
{
	__load_core($file . '.ctl', 'controls');
}


/**
 * 配置加载函数
 *
 * @param string 文件名
 */
function &load_conf($file)
{
	GLOBAL $__core_env;
	if($__core_env["conf"][$file]) return $__core_env["conf"][$file];
	
	$k = $file;

	$tag = '';
	$pos = strpos($file, ':');
	if($pos !== false)
	{
		$tag = substr($file, 0, $pos);
		$file = substr($file, $pos + 1);
	}

	if(!in_array(substr($file, 0, 1), array('/', '\\')))
	{
		$file = '/' . $file;
	}

	$file = $dir . $file;
	if(substr($file, 0, 1) == '/') $file = substr($file , 1);

	$conf = array();
	if($tag == 'pub') $f = CFG_ROOT . "/{$file}.cfg.php";
	else $f = APPLICATON_ROOT . "/configs/{$file}.cfg.php";
	if(!file_exists($f)) return false;

	require($f);
	$__core_env["conf"][$k] = $conf;

	return $__core_env["conf"][$k];
}

/**
 * dao加载函数
 *
 * @param string 文件名
 */
function load_dao($file)
{
	__load_core('pub:' . $file . '.dao', 'dao');
}

/**
 * 业务模型加载函数
 *
 * @param string 文件名
 */
function load_mod($file)
{
	__load_core($file . '.mod', 'models');

	$pos = strrpos($file, '/');
	if(false === $pos)
		$model_name = $file;
	else
		$model_name = substr($file, $pos + 1, 100);

	$class = $model_name . 'Model';

	if(!class_exists($class))
	{
		trigger_error($class . '  模型未定义.', E_USER_ERROR);
		return false;
	}
}

/**
 * Controller调用
 */
function ctlcall($module,$method,$args = array()) 
{
	//加载控制器接口文件
	$module = str_replace(array('-'), array('/'), $module);
	load_ctl($module);
	$pos 	= strrpos($module, '/');
	$class  = $module;
	if(false !== $pos){
		$class = substr($class, $pos + 1, 100);
	}
	$class[0]  = strtoupper($class[0]);
	$className = $class."Control";
	return BaseCall("ctl",$className,$method,$args);
}

/**
 * MODEL调用
 */
function modcall($module,$method,$args = array()) {
	//加载控制器接口文件
	$module = str_replace(array('-'), array('/'), $module);
	load_mod($module);
	$pos 	= strrpos($module, '/');
	$class  = $module;
	if(false !== $pos){
		$class = substr($class, $pos + 1, 100);
	}
	$class[0]  = strtoupper($class[0]);
	$className = $class."Model";
	return BaseCall("mod",$className,$method,$args);
}

/**
 * DAO调用
 */
function daocall($module,$method,$args) {
	//加载DAO层文件
	load_dao($module);
	$pos 	= strrpos($module, '/');
	$class  = $module;
	if(false !== $pos){
		$class = substr($class, $pos + 1, 100);
	}
	$class[0]  = strtoupper($class[0]);
	$className = $class."DAO";
	return BaseCall("dao",$className,$method,$args);
}

function snscall($module,$method,$args) {
	load_sns($module);
	$pos 	= strrpos($module, '/');
	$class  = $module;
	if(false !== $pos){
		$class = substr($class, $pos + 1, 100);
	}
	$class[0]  = strtoupper($class[0]);
	$className = $class;
	return BaseCall("sns",$className,$method,$args);
}

/**
 * 核心函数
 * 调用类名为className的method函数
 * @param String className	类名
 * @param String method		调用的函数名
 * @param Boolean mul_mod	是否多例模式，默认为单例模式
 * @return Mixed 成功：目标函数的返回结果；失败：false
 */
function BaseCall($module,$className,$method,$args,$mul_mod = false) {
	$object	= $module == 'ctl' ? new $className : $className;
	if($object && method_exists($object, $method))
	{
		$result = call_user_func_array(array($object, $method), $args);
		return $result;
	} else {
		return false;
	}
}

/**
 * 获得微妙数
 */
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

ob_end_flush();
?>
